package handler_sys

import (
	_ "go_web/internal/model"
	"go_web/internal/model/model_sys"
	"go_web/internal/req/req_sys"
	"go_web/internal/res/res_sys"
	"go_web/internal/service/service_sys"
	"go_web/pkg/req"
	"go_web/pkg/res"
	"net/http"
	"regexp"
	"strconv"

	"github.com/gin-gonic/gin"
)

type SysAuthCodeHandler struct {
	SysAuthCodeService *service_sys.SysAuthCodeService
}

func NewSysAuthCodeHandler(SysAuthCodeService *service_sys.SysAuthCodeService) *SysAuthCodeHandler {
	return &SysAuthCodeHandler{SysAuthCodeService}
}

// Detail 查询SysAuthCode详情
// @Summary 查询SysAuthCode详情
// @Tags SysAuthCodeHandler
// @Accept json
// @Produce json
// @Param id query string true "主键ID"
// @Success 200 {object} res.R[model_sys.SysAuthCode] "SysAuthCode"
// @Router /sys-auth-code/detail [get]
func (h *SysAuthCodeHandler) Detail(ctx *gin.Context) {
	id := ctx.Query("id")
	id64, err := strconv.ParseInt(id, 10, 64)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
		return
	}
	SysAuthCode, err := h.SysAuthCodeService.Detail(ctx, id64)
	if err != nil {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail("查询不到"))
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[model_sys.SysAuthCode]().Ok(*SysAuthCode))
}

// Page 分页查询SysAuthCode
// @Summary 分页查询SysAuthCode
// @Tags SysAuthCodeHandler
// @Accept json
// @Produce json
// @Param queryParams query req_sys.SysAuthCodePageReq false "分页请求参数"
// @Success 200 {object} res.R[res.PageRes]
// @Router /sys-auth-code/page [get]
func (h *SysAuthCodeHandler) Page(ctx *gin.Context) {
	var pageReq req_sys.SysAuthCodePageReq
	if err := ctx.ShouldBindQuery(&pageReq); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	page, err := h.SysAuthCodeService.Page(ctx, pageReq)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, res.NewR[res.PageRes]().Ok(*page))
}

// Add 创建SysAuthCode
// @Summary 创建SysAuthCode
// @Tags SysAuthCodeHandler
// @Accept json
// @Produce json
// @Param jsonParams body req_sys.SysAuthCodeAddReq true "SysAuthCode"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys-auth-code/add [post]
func (h *SysAuthCodeHandler) Add(ctx *gin.Context) {
	var reqSys req_sys.SysAuthCodeAddReq
	if err := ctx.ShouldBindJSON(&reqSys); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	id, err := h.SysAuthCodeService.Add(ctx, reqSys)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(id))
}

// Edit 修改SysAuthCode
// @Summary 修改SysAuthCode
// @Tags SysAuthCodeHandler
// @Accept json
// @Produce json
// @Param jsonParams body req_sys.SysAuthCodeEditReq true "SysAuthCode"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys-auth-code/edit [post]
func (h *SysAuthCodeHandler) Edit(ctx *gin.Context) {
	var reqSys req_sys.SysAuthCodeEditReq
	if err := ctx.ShouldBindJSON(&reqSys); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	n, err := h.SysAuthCodeService.Edit(ctx, reqSys)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(n))
}

// Delete 删除SysAuthCode
// @Summary 删除SysAuthCode
// @Tags SysAuthCodeHandler
// @Accept json
// @Produce json
// @Param jsonParams body req.IdsReq true "ID集合"
// @Success 200 {object} res.R[int64] "操作结果"
// @Router /sys-auth-code/delete [post]
func (h *SysAuthCodeHandler) Delete(ctx *gin.Context) {
	var idsReq req.IdsReq
	if err := ctx.ShouldBindJSON(&idsReq); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	n, err := h.SysAuthCodeService.Delete(ctx, idsReq)
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[int64]().Ok(n))
}

// GetGraph 获取图形验证码
// @Summary 获取图形验证码
// @Tags SysAuthCodeHandler
// @Accept json
// @Produce json
// @Success 200 {object} res.R[res_sys.RetCode] "SysAuthCode"
// @Router /sys-auth-code/graph [get]
func (h *SysAuthCodeHandler) GetGraph(ctx *gin.Context) {
	retCode, err := h.SysAuthCodeService.GetCode(ctx, "GraphCode")
	if err != nil {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail(err.Error()))
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[res_sys.RetCode]().Ok(*retCode))
}

// GetEasyMath 获取简单算术验证码
// @Summary 获取简单算术验证码
// @Tags SysAuthCodeHandler
// @Accept json
// @Produce json
// @Success 200 {object} res.R[res_sys.RetCode] "SysAuthCode"
// @Router /sys-auth-code/easy-math [get]
func (h *SysAuthCodeHandler) GetEasyMath(ctx *gin.Context) {
	retCode, err := h.SysAuthCodeService.GetCode(ctx, "EasyMathCode")
	if err != nil {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail(err.Error()))
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[res_sys.RetCode]().Ok(*retCode))
}

// SendEmailCode 发送邮箱验证码
// @Summary 发送邮箱验证码
// @Tags SysAuthCodeHandler
// @Accept json
// @Produce json
// @Param email query string true "目标邮箱"
// @Param username query string false "关联用户名"
// @Success 200 {object} res.R[string] "SysAuthCode"
// @Router /sys-auth-code/email/send [get]
func (h *SysAuthCodeHandler) SendEmailCode(ctx *gin.Context) {
	email := ctx.Query("email")
	username := ctx.Query("username")
	emailRegex := regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
	if !emailRegex.MatchString(email) {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail("邮箱格式错误"))
		return
	}
	clientIp := ctx.ClientIP()
	err := h.SysAuthCodeService.SendEmailCode(ctx, email, username, clientIp)
	if err != nil {
		ctx.JSON(http.StatusOK, res.NewR[string]().Fail(err.Error()))
		return
	}
	ctx.JSON(http.StatusOK, res.NewR[string]().Ok("发送成功"))
}
